<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 网页的生成过程，大致可以分成五步。

    // 1. HTML代码转化成DOM
    // 2. CSS代码转化成CSSOM（CSS Object Model）
    // 3. 结合DOM和CSSOM，生成一棵渲染树（包含每个节点的视觉信息）
    // 4. 生成布局（layout），即将所有渲染树的所有节点进行平面合成
    // 5. 将布局绘制（paint）在屏幕上
    // 这五步里面，第一步到第三步都非常快，耗时的是第四步和第五步。

    // "生成布局"（flow）和"绘制"（paint）这两步，合称为"渲染"（render）。

    // 网页生成的时候，至少会渲染一次。用户访问的过程中，还会不断重新渲染。
    // 以下三种情况，会导致网页重新渲染。
    // 修改DOM  (元素的内容  属性 )
    // 修改样式表 (样式)
    // 用户事件（比如鼠标悬停、页面滚动、输入框键入文字、改变窗口大小等等）

    // 重新渲染，就需要重新生成布局和重新绘制。前者叫做"重排"（reflow => 回流），后者叫做"重绘"（repaint）。
    // 需要注意的是，"重绘"不一定需要"重排"，比如改变某个网页元素的颜色，就只会触发"重绘"，不会触发"重排"，因为布局没有改变。但是，"重排"必然导致"重绘"，比如改变一个网页元素的位置，就会同时触发"重排"和"重绘"，因为布局改变了。


    // 哪些属性会导致重排?
    // css
    // width height border padding margin float position  flex   grid
    // font-size line-height

    // js
    // offsetTop/offsetLeft/offsetWidth/offsetHeight
    // scrollTop/scrollLeft/scrollWidth/scrollHeight
    // clientTop/clientLeft/clientWidth/clientHeight
    // getComputedStyle()

    // 哪些属性会导致重绘?
    // color border-color  background-color opacity  translate

    // 提高性能的技巧#
    // 1. 由于浏览器会尽量把所有的变动都集中在一起，排成一个队列，然后一次性执行，尽量避免多次重新渲染。因此，在DOM的多个读操作（或多个写操作），应该放在一起。不要两个读操作之间，加入一个写操作。
    // 2. 如果某个样式是通过重排得到的，那么最好缓存结果，避免下一次用到的时候，浏览器又要重排。
    // 不要一条条地改变样式，而要通过改变class，或者csstext属性，一次性地改变样式。
    // 3. 先将元素设为display: none（需要1次重排和重绘），然后对这个节点进行100次操作，最后再恢复显示（需要1次重排和重绘）。这样就只用两次重新渲染。
    // 4. position属性为absolute或fixed的元素，重排的开销会比较小，元素脱离了文档流，它的变化不会影响到其他元素；
    // 5. 尽量使用离线DOM，而不是真实的网面DOM，来改变元素样式。比如，操作Document Fragment对象，完成后再把这个对象加入DOM。再比如，使用 cloneNode() 方法，在克隆的节点上进行操作，然后再用克隆的节点替换原始节点。
    // 6. 只在必要的时候，才将元素的display属性为可见，因为不可见的元素不影响重排和重绘。另外，visibility: hidden的元素只对重绘有影响，不影响重排。
    // 5. 使用window.requestAnimationFrame()、window.requestIdleCallback()这两个方法调节重新渲染。



</script>

</html>